package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BlogDao {
    // 1.新增一个博客
    public void add(Blog blog) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // 1.和数据库建立连接
            connection = DBUtil.getConnection();
            // 2.构造 sql
            String sql = "insert into blog values(null, ?, ?, ?, ?)";
            statement = connection.prepareStatement(sql);
            // 替换操作
            statement.setString(1, blog.getTitle());
            statement.setString(2, blog.getContent());
            statement.setTimestamp(3, blog.getPostTimestamp());
            statement.setInt(4, blog.getUserId());
            // 3.执行 sql
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            // 4.释放资源
            DBUtil.close(connection, statement, null);
        }
    }

    // 2.根据博客 id 来查询指定博客(博客详情页)
    public Blog selectById(int blogId) {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            // 1.和数据库建立连接
            connection = DBUtil.getConnection();
            // 2.构造查询 sql
            String sql = "select * from blog where biogId = ?";
            statement = connection.prepareStatement(sql);
            statement.setInt(1, blogId);
            // 3.执行 sql
            resultSet = statement.executeQuery();
            // 4.遍历结果集和 由于 blogId 在 bolg 表中是唯一的（主键）
            // 此时的查询结果要么是没有查到任何数据，要么只有一条记录
            // 此处可以不使用 while，使用 if 判定即可
            if (resultSet.next()) {
                Blog blog = new Blog();
                // 把从数据库中读到信息设置到 blog 对象中
                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                blog.setContent(resultSet.getString("content"));
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                blog.setUserId(resultSet.getInt("userId"));
                return blog;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            // 4.释放资源
            DBUtil.close(connection, statement, resultSet);
        }
        return null;
    }

    // 3.直接查询出数据库中所有的博客列表(博客列表页)
    public List<Blog> selectAll() {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List<Blog> blogs = new ArrayList<>();
        try {
            // 1.和数据库建立连接
            connection = DBUtil.getConnection();
            // 2.构造查询 sql
            String sql = "select * from blog order by postTime desc";
            statement = connection.prepareStatement(sql);
            // 3.执行sql - 增删改 使用 executeUpdate 查使用 executeQuery
            resultSet = statement.executeQuery();
            // 4.遍历结果集合
            while (resultSet.next()) {
                Blog blog = new Blog();
                // 把从数据库中读到信息设置到 blog 对象中
                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                // 需要注意的是在博客列表页是不需要把整个正文全部显示出来的
                // 这里可以可以设置一个显示的篇幅
                String content = resultSet.getString("content");
                // 将篇幅的长度设置为 128
                if (content.length() >= 128) {
                    // 如果篇幅大于 128 就提取 128 长度的篇幅
                    // 这只是一个随便设置的篇幅长度
                    // 如果最终显示出来效果不好看，还可以随时更改
                    content = content.substring(0, 128) + "...";
                }
                blog.setContent(content);
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                blog.setUserId(resultSet.getInt("userId"));
                // 调用 add 方法添加进去
                blogs.add(blog);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            //  释放资源
            DBUtil.close(connection, statement, resultSet);
        }
        return blogs;
    }

    // 4.删除指定博客
    public void delete(int blogId) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // 1.和数据库建立连接
            connection = DBUtil.getConnection();
            // 2.构造查询 sql
            String sql = "delete * from blog where blogId = ?";
            statement = connection.prepareStatement(sql);
            statement.setInt(1, blogId);
            // 3.执行sql - 增删改 使用 executeUpdate 查使用 executeQuery
            statement.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            DBUtil.close(connection, statement, null);
        }
    }
}
